/**
 * 请实现一个函数，输入一个整数（以二进制串形式），输出该数二进制表示中 1 的个数。
 * 例如，把 9 表示成二进制是 1001，有 2 位是 1。因此，如果输入 9，则该函数输出 2。
 **/

#include<iostream>
#include<bitset>
using namespace std;

/**
 * Solution 1:调用bitset库
 **/
class Solution_1 {
public:
    int hammingWeight(uint32_t n) {
        bitset<32> foo (n);
        return foo.count();
    }
};


/**
 * Sulution 2：每一位与1做与运算，循环检查
 **/
class Solution_2 {
public:
    int hammingWeight(uint32_t n) {
        int count = 0;
        for(int i=0; i<32; i++){
            // 1按二进制依次左移，与n的每一位做与运算
            if(n & (1 << i)){
                count ++;
            }
        }
        return count;
    }
};


/**
 * Solution 3:方法2有个问题，它会依此检查完n的所有位，即使前面的位数已经没有1了
 * 方法3选择对n进行右移，当n右移后结果为0，就证明所有为1的位数已经检查过了
 **/
class Solution {
public:
    int hammingWeight(uint32_t n) {
        int count = 0;
        while (n != 0){
            if(n & 1){
                count ++;
            }
            n = n >> 1;
        }
        
        return count;
    }
};